package com.buaa.divinationmaster.core.database.dao;

import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;
import androidx.room.Update;

import com.buaa.divinationmaster.core.database.entities.TarotCard;

import java.util.List;

/**
 * 塔罗牌数据访问对象 (DAO)
 * 提供塔罗牌数据的CRUD操作和查询功能
 */
@Dao
public interface TarotCardDao {
    
    /**
     * 获取所有塔罗牌，按ID排序
     * @return LiveData包装的塔罗牌列表
     */
    @Query("SELECT * FROM tarot_cards ORDER BY id")
    LiveData<List<TarotCard>> getAllCards();
    
    /**
     * 获取所有塔罗牌 (同步方法)
     * @return 塔罗牌列表
     */
    @Query("SELECT * FROM tarot_cards ORDER BY id")
    List<TarotCard> getAllCardsSync();
    
    /**
     * 根据类型获取塔罗牌
     * @param type 卡牌类型 ("major" 或 "minor")
     * @return LiveData包装的塔罗牌列表
     */
    @Query("SELECT * FROM tarot_cards WHERE type = :type ORDER BY id")
    LiveData<List<TarotCard>> getCardsByType(String type);
    
    /**
     * 根据类型获取塔罗牌 (同步方法)
     * @param type 卡牌类型
     * @return 塔罗牌列表
     */
    @Query("SELECT * FROM tarot_cards WHERE type = :type ORDER BY id")
    List<TarotCard> getCardsByTypeSync(String type);
    
    /**
     * 根据ID获取特定塔罗牌
     * @param cardId 卡牌ID
     * @return 塔罗牌对象
     */
    @Query("SELECT * FROM tarot_cards WHERE id = :cardId")
    TarotCard getCardById(int cardId);
    
    /**
     * 根据ID列表获取多张塔罗牌
     * @param cardIds 卡牌ID列表
     * @return 塔罗牌列表
     */
    @Query("SELECT * FROM tarot_cards WHERE id IN (:cardIds)")
    List<TarotCard> getCardsByIds(List<Integer> cardIds);
    
    /**
     * 获取大阿卡纳 (22张)
     * @return 大阿卡纳列表
     */
    @Query("SELECT * FROM tarot_cards WHERE type = 'major' ORDER BY id")
    List<TarotCard> getMajorArcana();
    
    /**
     * 获取小阿卡纳 (56张)
     * @return 小阿卡纳列表
     */
    @Query("SELECT * FROM tarot_cards WHERE type = 'minor' ORDER BY suit, number")
    List<TarotCard> getMinorArcana();
    
    /**
     * 根据花色获取小阿卡纳
     * @param suit 花色 (wands/cups/swords/pentacles)
     * @return 特定花色的小阿卡纳列表
     */
    @Query("SELECT * FROM tarot_cards WHERE type = 'minor' AND suit = :suit ORDER BY number")
    List<TarotCard> getMinorArcanaBySuit(String suit);
    
    /**
     * 根据元素属性获取塔罗牌
     * @param element 元素 (fire/water/air/earth)
     * @return 特定元素的塔罗牌列表
     */
    @Query("SELECT * FROM tarot_cards WHERE element = :element ORDER BY id")
    List<TarotCard> getCardsByElement(String element);
    
    /**
     * 搜索塔罗牌 (根据中文名或英文名)
     * @param searchQuery 搜索关键词
     * @return 匹配的塔罗牌列表
     */
    @Query("SELECT * FROM tarot_cards WHERE name_zh LIKE '%' || :searchQuery || '%' OR name_en LIKE '%' || :searchQuery || '%' ORDER BY id")
    List<TarotCard> searchCards(String searchQuery);
    
    /**
     * 根据关键词搜索塔罗牌
     * @param keyword 关键词
     * @return 匹配的塔罗牌列表
     */
    @Query("SELECT * FROM tarot_cards WHERE upright_keywords LIKE '%' || :keyword || '%' OR reversed_keywords LIKE '%' || :keyword || '%' ORDER BY id")
    List<TarotCard> searchByKeywords(String keyword);
    
    /**
     * 获取随机塔罗牌 (用于洗牌算法的基础)
     * @param limit 限制数量
     * @return 随机塔罗牌列表
     */
    @Query("SELECT * FROM tarot_cards ORDER BY RANDOM() LIMIT :limit")
    List<TarotCard> getRandomCards(int limit);
    
    /**
     * 插入所有塔罗牌 (批量插入，用于初始化数据)
     * @param cards 塔罗牌列表
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertAll(List<TarotCard> cards);
    
    /**
     * 插入单张塔罗牌
     * @param card 塔罗牌对象
     * @return 插入的行ID
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    long insert(TarotCard card);
    
    /**
     * 更新塔罗牌信息
     * @param card 塔罗牌对象
     */
    @Update
    void update(TarotCard card);
    
    /**
     * 删除塔罗牌
     * @param card 塔罗牌对象
     */
    @Delete
    void delete(TarotCard card);
    
    /**
     * 获取塔罗牌总数
     * @return 总数
     */
    @Query("SELECT COUNT(*) FROM tarot_cards")
    int getCardCount();
    
    /**
     * 获取大阿卡纳数量
     * @return 大阿卡纳数量
     */
    @Query("SELECT COUNT(*) FROM tarot_cards WHERE type = 'major'")
    int getMajorArcanaCount();
    
    /**
     * 获取小阿卡纳数量
     * @return 小阿卡纳数量
     */
    @Query("SELECT COUNT(*) FROM tarot_cards WHERE type = 'minor'")
    int getMinorArcanaCount();
    
    /**
     * 检查塔罗牌数据是否已初始化
     * @return 是否已初始化
     */
    @Query("SELECT COUNT(*) > 0 FROM tarot_cards")
    boolean isDataInitialized();
    
    /**
     * 清空所有塔罗牌数据 (用于重新初始化)
     */
    @Query("DELETE FROM tarot_cards")
    void deleteAll();
}
